// 控制应用生命周期和创建原生浏览器窗口的模组

import {app, BrowserWindow, ipcMain, dialog} from 'electron'
import * as path from 'node:path'
import * as url from 'node:url'
import * as fs from 'node:fs'
import * as os from 'node:os'

let __filename = url.fileURLToPath(import.meta.url)
let __dirname = path.dirname(__filename)

// 存储最近文件列表的路径
const recentFilesPath = path.join(os.homedir(), '.point-cloud-viewer-recent.json')

function createWindow() {
  const mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    autoHideMenuBar:true, //隐藏菜单栏
    webPreferences: {
      // 书写渲染进程中的配置
      nodeIntegration: true, 
      contextIsolation: false, // 可以使用require方法
      enableRemoteModule: true, // 可以使用remote方法
    },
    // 允许跨域
    webSecurity: true, // 允许跨域
  })

  let env = 'pro222'
  // 配置热更新
  if (env == 'pro') {
    const elePath = path.join(__dirname, '../node_modules/electron')
    import('electron-reload').then((reload) => {
      import(elePath).then((electron) => {
        reload.default('../', {
          electron: electron.default || electron,
        })
      })
    })
    mainWindow.loadURL('http://localhost:5173')
    mainWindow.webContents.openDevTools()
  } else {
    // 生产环境中要加载文件，打包的版本
    // Menu.setApplicationMenu(null)
    // 加载 index.html
    mainWindow.webContents.openDevTools()
    mainWindow.loadFile(path.join(__dirname, '../../dist/index.html'))
  }

  // 设置窗口最小尺寸
  mainWindow.setMinimumSize(800, 600)

  // 处理窗口关闭事件
  mainWindow.on('closed', () => {
    // 清理资源
  })
}

// 读取文件
ipcMain.handle('readFile', async (event, filePath) => {
  try {
    const data = await fs.promises.readFile(filePath)
    return data
  } catch (error) {
    throw new Error(`读取文件失败: ${error.message}`)
  }
})

// 显示文件选择对话框
ipcMain.handle('showOpenDialog', async (event, options) => {
  try {
    const result = await dialog.showOpenDialog({
      properties: ['openFile'],
      filters: [
        { name: '点云文件', extensions: ['las', 'laz', 'e57', 'ply', 'xyz', 'pts', 'json'] },
        { name: '所有文件', extensions: ['*'] }
      ],
      ...options
    })
    return result
  } catch (error) {
    throw new Error(`打开文件对话框失败: ${error.message}`)
  }
})

// 保存最近文件列表
ipcMain.handle('saveRecentFiles', async (event, files) => {
  try {
    await fs.promises.writeFile(recentFilesPath, JSON.stringify(files, null, 2))
    return true
  } catch (error) {
    console.error('保存最近文件列表失败:', error)
    return false
  }
})

// 获取最近文件列表
ipcMain.handle('getRecentFiles', async (event) => {
  try {
    if (fs.existsSync(recentFilesPath)) {
      const data = await fs.promises.readFile(recentFilesPath, 'utf8')
      return JSON.parse(data)
    }
    return []
  } catch (error) {
    console.error('读取最近文件列表失败:', error)
    return []
  }
})
ipcMain.handle('copy-to-public', async (event, filePath) => {
  const publicDir = path.join(app.getAppPath(), 'public');
  let srcDir, destDir, webPath;
  const stat = await fs.promises.stat(filePath);
  if (stat.isDirectory()) {
    srcDir = filePath;
    destDir = path.join(publicDir, path.basename(filePath));
    webPath = '/' + path.basename(filePath);
  } else {
    srcDir = path.dirname(filePath);
    destDir = path.join(publicDir, path.basename(srcDir));
    webPath = '/' + path.basename(srcDir)+ '/' + path.basename(filePath);
  }
  await copyDirectory(srcDir, destDir);
  return webPath; // 返回web可访问路径
});

async function copyDirectory(src, dest) {
  await fs.promises.mkdir(dest, { recursive: true });
  const entries = await fs.promises.readdir(src, { withFileTypes: true });
  for (const entry of entries) {
    const srcPath = path.join(src, entry.name);
    const destPath = path.join(dest, entry.name);
    if (entry.isDirectory()) {
      await copyDirectory(srcPath, destPath);
    } else {
      await fs.promises.copyFile(srcPath, destPath);
    }
  }
}

// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow()

  app.on('activate', function () {
    // 通常在 macOS 上，当点击 dock 中的应用程序图标时，如果没有其他
    // 打开的窗口，那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 除了 macOS 外，当所有窗口都被关闭的时候退出程序。 因此，通常对程序和它们在
// 任务栏上的图标来说，应当保持活跃状态，直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})
